Skip to content

Conversation

@juniskane
Copy link
Contributor

POSIX: "When '-e' option is on and when any command fails (for any of the reasons listed in 2.8.1 Consequences of Shell Errors or by returning an exit status greater than zero), the shell immediately shall exit, with the following exceptions:

  1. The failure of any individual command in a multi-command pipeline, or of any subshell environments in which command substitution was performed during word expansion, shall not cause the shell to exit. Only the failure of the pipeline itself shall be considered.
  2. The -e setting shall be ignored when executing the compound list following the while, until, if, or elif reserved word, a pipeline beginning with the ! reserved word, or any command of an AND-OR list other than the last.
  3. If the exit status of a compound command other than a subshell command was the result of a failure while -e was being ignored, then -e shall not apply to this command."

This implementation stores a flag in control flow to keep track, when 'set -e' is allowed to exit shell. This is somewhat unfortunate, but I could not figure out where to put it in AST so that it works correctly for every contrived special case that POSIX spec mandates.

Adds test cases for aforementioned tricky corner cases and we pass them all.

POSIX: "When '-e' option is on and when any command fails (for any of
the reasons listed in 2.8.1 Consequences of Shell Errors or by returning
an exit status greater than zero), the shell immediately shall exit,
with the following exceptions:

1. The failure of any individual command in a multi-command pipeline,
   or of any subshell environments in which command substitution was
   performed during word expansion, shall not cause the shell to exit.
   Only the failure of the pipeline itself shall be considered.
2. The -e setting shall be ignored when executing the compound list
   following the while, until, if, or elif reserved word, a pipeline
   beginning with the ! reserved word, or any command of an AND-OR
   list other than the last.
3. If the exit status of a compound command other than a subshell command
   was the result of a failure while -e was being ignored, then -e shall
   not apply to this command."

This implementation stores a flag in control flow to keep track, when
'set -e' is allowed to exit shell. This is somewhat unfortunate, but
I could not figure out where to put it in AST so that it works correctly
for every contrived special case that POSIX spec mandates.

Adds test cases for aforementioned tricky corner cases and we pass them all.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant